home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / continuations.st < prev    next >
Text File  |  1993-07-24  |  2KB  |  103 lines

  1. "    NAME        continuations
  2.     AUTHOR        ikp@cs.man.ac.uk
  3.     FUNCTION     continuations, as in Scheme
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    continuations
  11.     provides  a  continuation  mechanism  (a  la Scheme).
  12.    Sending a block  the message ""callCC""  activates the block, passing
  13.    the current continuation as the argument.  This continuation can be
  14.    triggered  by sending  it a ""value:  anObect"" message; control will
  15.    jump back to the point at which the continuation  was created, with
  16.    anObject as the result.  Once created, a  continuation can be fired
  17.    any  number of times.  To fire  a continuation that is never needed
  18.    again, you can use ""oneShotValue:  anObject"" which is a little more
  19.    efficient.   The  trivial case  ""[:x|x] callCC""   takes 40mS on our
  20.    3/180.   See R.   K.  Dybvig,  ""The Scheme Programming   Language"",
  21.    section 4.6. (2.2). IKP
  22. "!
  23. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 8 November 1988 at 6:40:11 am'!
  24.  
  25.  
  26.  
  27. !ContextPart methodsFor: 'accessing'!
  28.  
  29. copyStack
  30.     sender isNil ifTrue:[^self copy] ifFalse: [^(self copy) sender: self sender copyStack]! !
  31.  
  32.  
  33.  
  34. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 8 November 1988 at 6:40:32 am'!
  35.  
  36.  
  37.  
  38. !ContextPart methodsFor: 'accessing'!
  39.  
  40. sender: s
  41.     sender _ s! !
  42.  
  43.  
  44. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 8 November 1988 at 6:57:37 am'!
  45.  
  46. Object subclass: #Continuation
  47.     instanceVariableNames: 'stack '
  48.     classVariableNames: ''
  49.     poolDictionaries: ''
  50.     category: 'Kernel-Methods'!
  51.  
  52.  
  53. !Continuation methodsFor: 'private'!
  54.  
  55. stack
  56.     ^stack!
  57.  
  58. stack: s
  59.     stack _ s! !
  60.  
  61. !Continuation methodsFor: 'invocation'!
  62.  
  63. oneShotValue
  64.     thisContext sender: stack.
  65.     ^nil!
  66.  
  67. oneShotValue: v
  68.     "escape to the original continuation with v as the result, discarding the stack on the way"
  69.  
  70.     thisContext sender: stack.
  71.     ^v!
  72.  
  73. value
  74.     thisContext sender: stack copyStack.
  75.     ^nil!
  76.  
  77. value: v
  78.     "return to the original continuation, copying the stack to allow another activation"
  79.  
  80.     thisContext sender: stack copyStack.
  81.     ^v! !
  82. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  83.  
  84. Continuation class
  85.     instanceVariableNames: ''!
  86.  
  87.  
  88. !Continuation class methodsFor: 'instance creation'!
  89.  
  90. fromContext: aStack
  91.     ^super new stack: aStack copyStack! !
  92.  
  93. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 8 November 1988 at 6:40:54 am'!
  94.  
  95.  
  96.  
  97. !BlockContext methodsFor: 'continuations'!
  98.  
  99. callCC
  100.     ^self value: (Continuation fromContext: thisContext sender)! !
  101.  
  102.  
  103.